package com.lanou3g.code0510.reflection;

import java.lang.reflect.Field;

/**
 * Created by dllo on 18/5/10.
 */
//通过反射来操作属性
public class Test02 {
    public static void main(String[] args) throws Exception {
        Person person = new Person();
        person.setName("张三");
        person.setAge(18);
        //反射第一步永远要拿到类类型
        Class clazz = person.getClass();
        Field[] fields = clazz.getDeclaredFields();
        //获取所有属性,declared叫做声明的,表示这个类只要写了,就能拿到
        //getDeclaredFields获取所有的属性(包括private属性),getFields获取每有访问权限的属性
        for (Field field : fields) {
            //循环拿到每一个成员变量
            //让这个成员变量可以被访问(突破权限)
            field.setAccessible(true);//写上这句话,就可以访问任何权限的成员变量
            //获取变量名
            String name = field.getName();
            //获取变量值
            Object value = field.get(person);
            //field为属性,例:即为private String name;person为对象;field没有任何对象的信息,有的只是
            //这个类里的属性,方法
            String typeName = field.getType().getSimpleName();//获取变量类型
            System.out.println(name + "-" + value + "-" + typeName);
            System.out.println(name + "-" + value);
        }
        //通过反射来改属性
        Field nameField = clazz.getDeclaredField("name");
        nameField.setAccessible(true);
        //person.name="李四";与下面作用完全相等;nameField为name,set为=,person为person,李四为李四
        nameField.set(person, "李四");
        System.out.println(person.getName());
    }
}
